From 9b1f6acc2bf7b51781772dd5623b8f4701e4e520 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Wed, 22 Nov 2017 16:53:15 +0100 Subject: [PATCH] broadway: Add shadow node --- gdk/broadway/broadway-protocol.h | 1 + gdk/broadway/broadway.js | 23 +++++++++++ gdk/broadway/broadwayd.c | 10 ++++- gsk/gskbroadwayrenderer.c | 66 ++++++++++++++++++++++---------- 4 files changed, 78 insertions(+), 22 deletions(-) diff --git a/gdk/broadway/broadway-protocol.h b/gdk/broadway/broadway-protocol.h index e4ce21e6e1..f1b1504463 100644 --- a/gdk/broadway/broadway-protocol.h +++ b/gdk/broadway/broadway-protocol.h @@ -17,6 +17,7 @@ typedef enum { /* Sync changes with broadway.js */ BROADWAY_NODE_INSET_SHADOW = 5, BROADWAY_NODE_ROUNDED_CLIP = 6, BROADWAY_NODE_LINEAR_GRADIENT = 7, + BROADWAY_NODE_SHADOW = 8, } BroadwayNodeType; typedef enum { diff --git a/gdk/broadway/broadway.js b/gdk/broadway/broadway.js index dd9ea1ca11..57565d5ad5 100644 --- a/gdk/broadway/broadway.js +++ b/gdk/broadway/broadway.js @@ -592,6 +592,29 @@ SwapNodes.prototype.handle_node = function(parent, offset_x, offset_y) } break; + case 8: // SHADOW + { + var len = this.decode_uint32(); + var filters = ""; + for (var i = 0; i < len; i++) { + var color = this.decode_color(); + var dx = this.decode_float(); + var dy = this.decode_float(); + var blur = this.decode_float(); + filters = filters + "drop-shadow(" + args (px(dx), px(dy), px(blur), color) + ")"; + } + var div = document.createElement('div'); + div.style["position"] = "absolute"; + div.style["left"] = px(0); + div.style["top"] = px(0); + div.style["filter"] = filters; + + parent.appendChild(div); + this.handle_node(div, offset_x, offset_y); + } + break; + + default: alert("Unexpected node type " + type); } diff --git a/gdk/broadway/broadwayd.c b/gdk/broadway/broadwayd.c index 693e76cab5..6314ce92e4 100644 --- a/gdk/broadway/broadwayd.c +++ b/gdk/broadway/broadwayd.c @@ -222,13 +222,14 @@ get_client_serial (BroadwayClient *client, guint32 daemon_serial) #define NODE_SIZE_RECT (NODE_SIZE_POINT + NODE_SIZE_SIZE) #define NODE_SIZE_RRECT (NODE_SIZE_RECT + 4 * NODE_SIZE_SIZE) #define NODE_SIZE_COLOR_STOP (NODE_SIZE_FLOAT + NODE_SIZE_COLOR) +#define NODE_SIZE_SHADOW (NODE_SIZE_COLOR + 3 * NODE_SIZE_FLOAT) static int rewrite_node_textures (BroadwayClient *client, int len, guint32 data[], int pos) { guint32 type; - guint32 i, n_children, n_stops; + guint32 i, n_children, n_stops, n_shadows; g_assert (pos < len); @@ -242,7 +243,7 @@ rewrite_node_textures (BroadwayClient *client, break; case BROADWAY_NODE_INSET_SHADOW: case BROADWAY_NODE_OUTSET_SHADOW: - pos += NODE_SIZE_RRECT + NODE_SIZE_COLOR + 4 * NODE_SIZE_COLOR; + pos += NODE_SIZE_RRECT + NODE_SIZE_COLOR + 4 * NODE_SIZE_FLOAT; break; case BROADWAY_NODE_TEXTURE: data[pos+4] = GPOINTER_TO_INT (g_hash_table_lookup (client->textures, @@ -263,6 +264,11 @@ rewrite_node_textures (BroadwayClient *client, n_stops = data[pos++]; pos += n_stops * NODE_SIZE_COLOR_STOP; break; + case BROADWAY_NODE_SHADOW: + n_shadows = data[pos++]; + pos += n_shadows * NODE_SIZE_SHADOW; + pos = rewrite_node_textures (client, len, data, pos); + break; default: g_assert_not_reached (); } diff --git a/gsk/gskbroadwayrenderer.c b/gsk/gskbroadwayrenderer.c index 07d8d186b6..49e4f7722c 100644 --- a/gsk/gskbroadwayrenderer.c +++ b/gsk/gskbroadwayrenderer.c @@ -437,32 +437,58 @@ gsk_broadway_renderer_add_node (GskRenderer *self, } return; - case GSK_TEXT_NODE: - default: + case GSK_SHADOW_NODE: { - GdkTexture *texture; - guint32 texture_id; - float off_x = 0, off_y = 0; - - texture = node_cache_lookup (node, &off_x, &off_y); - - if (!texture) + gsize i, n_shadows = gsk_shadow_node_get_n_shadows (node); + add_uint32 (nodes, BROADWAY_NODE_SHADOW); + add_uint32 (nodes, n_shadows); + for (i = 0; i < n_shadows; i++) { - texture = node_texture_fallback (node, &off_x, &off_y); - node_cache_store (node, texture, off_x, off_y); + const GskShadow *shadow = gsk_shadow_node_peek_shadow (node, i); + add_rgba (nodes, &shadow->color); + add_float (nodes, shadow->dx); + add_float (nodes, shadow->dy); + add_float (nodes, shadow->radius); } - - g_ptr_array_add (node_textures, texture); /* Transfers ownership to node_textures */ - texture_id = gdk_broadway_display_ensure_texture (display, texture); - add_uint32 (nodes, BROADWAY_NODE_TEXTURE); - add_float (nodes, node->bounds.origin.x + off_x); - add_float (nodes, node->bounds.origin.y + off_y); - add_float (nodes, gdk_texture_get_width (texture)); - add_float (nodes, gdk_texture_get_height (texture)); - add_uint32 (nodes, texture_id); + gsk_broadway_renderer_add_node (self, nodes, node_textures, + gsk_shadow_node_get_child (node)); } return; + + case GSK_TEXT_NODE: + default: + break; /* Fallback */ } + + { + GdkTexture *texture; + guint32 texture_id; + float off_x = 0, off_y = 0; + + texture = node_cache_lookup (node, &off_x, &off_y); + + if (!texture) + { + texture = node_texture_fallback (node, &off_x, &off_y); + g_print ("Fallback %p for %s\n", texture, node->node_class->type_name); + + node_cache_store (node, texture, off_x, off_y); + } + else + { + g_print ("Cache hit %p for %s\n", texture, + node->node_class->type_name); + } + + g_ptr_array_add (node_textures, texture); /* Transfers ownership to node_textures */ + texture_id = gdk_broadway_display_ensure_texture (display, texture); + add_uint32 (nodes, BROADWAY_NODE_TEXTURE); + add_float (nodes, node->bounds.origin.x + off_x); + add_float (nodes, node->bounds.origin.y + off_y); + add_float (nodes, gdk_texture_get_width (texture)); + add_float (nodes, gdk_texture_get_height (texture)); + add_uint32 (nodes, texture_id); + } } static void -- 2.30.2